#ifndef LAYER_HPP
#define LAYER_HPP

#define InvalidIndex -1
//------------------------------------------------------------------------------
// Fichier d'entête utilisés
//------------------------------------------------------------------------------
#include "Orientation.hpp"
#include "Region.hpp"

namespace ImageAnalysis
{
//----------------------------------------------------------------------
// Cette classe correspond à des renseignements de voisinages 
// entre des pixels.
//----------------------------------------------------------------------
class Layer
{
public:
		//----------------------------------------------------------------------
        // Structure
        //----------------------------------------------------------------------
		struct PixelNeighborHood
		{
			int index[9];
		};

        //----------------------------------------------------------------------
        // Constructeur
        //----------------------------------------------------------------------
        Layer( int width, int height );

        //----------------------------------------------------------------------
        // Destructeur
        //----------------------------------------------------------------------
        virtual ~Layer();

        //----------------------------------------------------------------------
        // Permet de récupérer l'index d'un pixel donné
        //----------------------------------------------------------------------
        int GetPixelIndex( int x, int y );

        //----------------------------------------------------------------------
        // Permet de récupérer le voisinage d'un pixel pour un index de pixel
        // donné
        //----------------------------------------------------------------------
        PixelNeighborHood& GetDirectPixelNeighborHood( int index );

        //----------------------------------------------------------------------
        // Permet de récupérer le voisinage d'un pixel à une certaine 
		// profondeur (la profondeur 1 étant les pixels directement autour)
        //----------------------------------------------------------------------
        int* GetPixelNeighborHood( int index , int depth);

	//----------------------------------------------------------------------
	// Permet de récupérer le voisinage d'un pixel en précisant la
	// largeur la hauteur du voisinage à récupérer.
	//----------------------------------------------------------------------
	int* GetPixelNeighborHood( int index , int width, int height);


        //----------------------------------------------------------------------
        // Permet de récupérer la largeur de la layer
        //----------------------------------------------------------------------
        int GetWidth( );

        //----------------------------------------------------------------------
        // Permet de récupérer la hauteur de la layer
        //----------------------------------------------------------------------
        int GetHeight( );

        //----------------------------------------------------------------------
        // Permet de dessiner la layer
        //----------------------------------------------------------------------
        virtual void Draw()=0;

protected:
        //----------------------------------------------------------------------
        // Attribut du layer
        //  - largeur
        //  - hauteur
        //----------------------------------------------------------------------
        int layerWidth;
        int layerHeight;

private:
        //----------------------------------------------------------------------
        // Permet l'initialisation du tableau de voisinage
        //----------------------------------------------------------------------
        void initializeNeighborHood();

        //----------------------------------------------------------------------
        // Attribut du layer
        //  - tableau de voisinage
        //----------------------------------------------------------------------
        PixelNeighborHood* layerPixelNeighborHood;

        //----------------------------------------------------------------------
        // Constructeur par copie et oprérateur d'affectation en privée pour
        // interdire leur utilisation
        //----------------------------------------------------------------------
        Layer( const Layer& copy);
        Layer& operator=( const Layer& copy );
};

}
#endif //LAYER_HPP
